package com.heima.comment.service.impl;
import com.heima.comment.service.CommentHotService;
import com.heima.model.comment.pojo.ApComment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class CommentHotServiceImpl implements CommentHotService {
    @Autowired
    MongoTemplate mongoTemplate;
    /**
     * 当此方法在Spring对象中被调用时
     * 会使用taskExecutor所配置的线程池 异步的执行
     * @param entryId
     * @param apComment
     */
    @Async("taskExecutor")
    @Override
    public void hotCommentExecutor(Long entryId, ApComment apComment) {
        log.info("计算热评 异步方法开始  ==> {}",apComment);
        // 1. 按照文章ID(entryId) 查询热点评论  flag = 1   按照点赞降序
        Query queryHot = Query.query(Criteria.where("entryId").is(entryId)
                .and("flag").is(1))
                .with(Sort.by(Sort.Direction.DESC,"likes"));
        List<ApComment> hotCommentList = mongoTemplate.find(queryHot, ApComment.class);

        // 2. 如果没有热评  或者  热评的数量 < 5  修改当前评论为热评
        if(hotCommentList==null || hotCommentList.size()<5){
            apComment.setFlag((short)1);
            mongoTemplate.save(apComment);
            return;
        }

        // 3. 如果热评数量大于等于5
        //  获取热评集合中 最后一条热评  和  当前评论做对比
        ApComment lastHotComment = hotCommentList.get(hotCommentList.size() - 1);
        //  如果当前评论点赞数>最后一条热评
        if(apComment.getLikes() > lastHotComment.getLikes()){
            //将当前评论修改为热评
            apComment.setFlag((short)1);
            mongoTemplate.save(apComment);
            //将最后一条评论改为普通评论
            lastHotComment.setFlag((short)0);
            mongoTemplate.save(lastHotComment);
            return;
        }
    }
}